//结构体
#include <stdio.h>
#include <string.h>
struct stu //学生
{
    char name[20];//字符串  汉字是字符，可以构成字符串，一个汉字一般占两个字符
    int age;
    char sex[10];
    char tele[12];
};
void set_stu(struct stu* ps)
{
    strcpy(ps->name,"李四"); //因为name为数组名,即为首地址,不能将字符串赋值给指针
    ps->age=18;
    strcpy(ps->sex,"nan");  //P50 strcpy函数将字符串拷贝到sex所指空间中 头文件<string.h>
    strcpy(ps->tele,"15519376452");
}
void print(struct stu* p)
{
    printf("%s %d %s %s\n",(*p).name,(*p).age,(*p).sex,(*p).tele);
    printf("%s %d %s %s\n",p->name,p->age,p->sex,p->tele);//打出p.后选择成员名 .自动变成->
}
int main()
{
    struct stu s={"张三",20,"nan","15519376453"};//初始化
    printf("%s %d %s %s\n",s.name,s.age,s.sex,s.tele);//必须一一对应
    set_stu(&s);
    print(&s);//自定义函数
    return 0;
}
/*输出：
张三 20 nan 15519376453
李四 18 nan 15519376452
李四 18 nan 15519376452
*/

//结构的声明
struct Peo
{
    //成员变量
    char name[20];
    char tele[12]; 
    char sex[5];
    int high;
}p3,p4;  //p3,p4是使用struct Peo结构体类型创建的2个全局变量，是结构体变量的定义
struct Peo p5;//全局变量，定义结构体变量
struct Stu
{
    struct Peo p; //嵌套结构体（把结构的声明写进另一个结构的声明里无意义，所以不要那么写）
    int num;      //可看25duilie.c3️⃣，涉及到嵌套结构体的应用
    float f;
};
void print1(struct Peo P1)
{
    printf("%s %s %s %d\n",P1.name,P1.tele,P1.sex,P1.high);
    //小美 19111380146 女 170
}
void print2(struct Peo* P1)
{
    printf("%s %s %s %d\n",P1->name,P1->tele,P1->sex,P1->high);
    //小美 19111380146 女 170
}
int main()
{
    struct Peo p1={"小美","19111380146","女",170};//局部变量，结构体变量的定义和初始化
    struct Stu p2={{"小明","18943876635","男",185},100,3.14f};//嵌套结构体定义和初始化
    printf("%s %s %s %d %d %f\n",p2.p.name,p2.p.tele,p2.p.sex,p2.p.high,p2.num,p2.f);
    //小明 18943876635 男 185 100 3.140000
    //结构体传参：
    print1(p1); //传结构体值
    print2(&p1);//传地址 （更好）
    //首选print2函数：函数传参的时候，参数是需要压栈的。
    //如果传递一个结构体对象时，结构体过大，参数压栈的系统开销比较大，所以会导致性能的下降。
    return 0;
}